public class TwoPointerAlgorithm {
    //移动零算法
    public void moveZeroes(int[] nums){

int dest=-1;   // 仓库还是空的，管理员蹲门口画圈圈
        for (int cur = 0; cur <nums.length ; cur++) {
            if (nums[cur]!=0){
                dest++;
                int temp=nums[cur];
                nums[cur]=nums[dest];
                nums[dest]=temp;
            }
        }
    }
    //复写零创建新数组算法
    public int[] DuplicateZero(int[] nums){
        int n=nums.length;
       // 创建大小相等的数组
        int[] num=new int[n];
        int dest=0;
        for (int cur = 0; cur <n ; cur++) {
           //必要的判断小心数组越界
            if(dest>=n)
                return num;;
            if (nums[cur]==0){
                num[dest++]=0;    //第一个零
                //重点如果dest在最后一个位置就要判断一下，否则复写0的时候会越界
               if (dest<n){
                num[dest++]=0;    //第二个零

               }

            }else {
                num[dest++]=nums[cur];
            }


        }
        return num;
    }
    //复写零
    public void DuplicateZero1(int[] num){
        int cur=0; int dest=-1;
        int n=num.length;
        while (cur<n){
            if (cur==0) dest+=2;
            else dest+=1;
            //循环停止条件
            if (dest>=n-1) break;
            cur++;
        }
        //临界情况如果dest出数组说明在最后一个位置是0的情况，第二个0写到数组外面了。
        if (dest==n){
            num[n-1]=0;
            dest-=2;
            cur--;
        }else dest--;
    //找到位置向前写
        while (cur>=0){
        if (cur==0){
            num[dest--]=0;
            num[dest--]=0;
            cur--;
        }else {
            num[dest--]=num[cur--];

        }
    }
    }

}
